#pragma once
#include <iostream>
#include <string>
#include <functional>
#include <pthread.h>

template <class T>
using func_t = std::function<void(T&)>; // 任务

template <class T>
class Thread
{
public:
    Thread(const std::string &threadname, func_t<T> func, T data)
        : _tid(0), _thread_name(threadname), _isrunning(false), _func(func), _data(data)
    {
    }
    // 执行方法
    static void* ThreadRoutine(void *args)
    {
        Thread *ts = static_cast<Thread *>(args);
        ts->_func(ts->_data);
        return nullptr;
    }
    // 启动
    bool Start()
    {
        int n = pthread_create(&_tid, nullptr, ThreadRoutine, this); // 将this指针传递给ThreadRoutine
        if(n == 0)
        {
            _isrunning = true;
            return true;
        }
        else return false;
    }
    // 等待
    bool Join()
    {
        if (!_isrunning)
            return false;
        int n = pthread_join(_tid, nullptr);
        if (n == 0)
        {
            return true;
        }
        return false;
    }
    bool IsRunning()
    {
        return _isrunning;
    }
    std::string ThreadName()
    {
        return _thread_name;
    }
    ~Thread() {}

private:
    pthread_t _tid;           // 线程id
    std::string _thread_name; // 线程名
    bool _isrunning;          // 线程是否运行
    func_t<T> _func;             // 线程所执行任务
    T _data;                   // 传递数据类型
};